package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.modelo.Ato;
import br.com.foxinline.modelo.AtoCampo;
import br.com.foxinline.modelo.AtoTipo;
import br.com.foxinline.modelo.TipoSelo;
import br.com.foxinline.servico.AtoCampoServico;
import br.com.foxinline.servico.AtoServico;
import br.com.foxinline.servico.AtoTipoServico;
import br.com.foxinline.servico.TipoSeloServico;
import br.com.foxinline.utilitario.Mensagem;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.DualListModel;

/**
 *
 * @author cadomeireles
 */
@ManagedBean
@ViewScoped
public class ManagerPesquisarAto implements Serializable {

    @EJB
    AtoServico atoServico;
    @EJB
    AtoCampoServico atoCampoServico;    
    @EJB
    AtoTipoServico atoTipoServico;
    @EJB
    TipoSeloServico tipoSeloServico;
    
    private Ato atoPesquisar;
    private Ato atoEditar;
    private Ato atoVisualizar;
    private Ato atoDeletar;
    private List<Ato> atos;
    private List<Ato> atosVisualizar;

    private AtoTipo atoTipoPesquisa;
    private AtoTipo atoTipoSelecionado;
    private List<AtoTipo> atoTipos;
    
    private TipoSelo tipoSeloPesquisa;
    private TipoSelo tipoSeloSelecionado;
    private List<TipoSelo> tiposSelo;    
    
    private List<AtoCampo> atoCampos;
    private List<AtoCampo> atoCamposSelecionados;
    private DualListModel<AtoCampo> atoCompoDualList;
    
    private String editarId;
    private String visualizarId;

    @PostConstruct
    public void init() {
        instanciar();        
        delegar();
    }

    private void instanciar() {
        this.atoPesquisar = new Ato();
        this.atoEditar = new Ato();
        this.atoVisualizar = new Ato();
        this.atoDeletar = new Ato();
        this.atos =  new ArrayList<Ato>();
        
        this.atoTipoPesquisa = new AtoTipo();
        this.atoTipoSelecionado = new AtoTipo();
        this.atoTipos = new ArrayList<AtoTipo>();

        this.tipoSeloPesquisa = new TipoSelo();
        this.tipoSeloSelecionado = new TipoSelo();
        this.tiposSelo = new ArrayList<TipoSelo>();
    }
    
    private void delegar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

        this.editarId = parametros.get("atoEditarId");
        this.visualizarId = parametros.get("atoVisualizarId");

        if (this.editarId != null) {
            this.atoEditar = atoServico.pesquisar(Long.parseLong(this.editarId));
            this.atoEditar.setAtoCampos(atoServico.obterCampos(this.atoEditar));
            
            this.atoCampos = atoCampoServico.pesquisarTodos();
            this.atoCampos.removeAll(this.atoEditar.getAtoCampos());
            this.atoCamposSelecionados = this.atoEditar.getAtoCampos();
            this.atoCompoDualList = new DualListModel<AtoCampo>(this.atoCampos, this.atoCamposSelecionados);
        }       

        if (this.visualizarId != null) {
            this.atoVisualizar = atoServico.pesquisar(Long.parseLong(this.visualizarId));
            this.atoVisualizar.setAtoCampos(atoServico.obterCampos(this.atoVisualizar));
        }
    }
    
    public void pesquisar() {
        this.atos = atoServico.pesquisar(this.atoPesquisar);
    }

    public void pesquisarAtoTipos() {
        this.atoTipos = atoTipoServico.pesquisar(this.atoTipoPesquisa);
    }    
    
    public void limpar() {
        instanciar();
    }

    public void selecionarAtoTipo() {
        this.atoEditar.setAtoTipo(this.atoTipoSelecionado);
        
        this.atoTipoPesquisa = new AtoTipo();
        this.atoTipoSelecionado = new AtoTipo();
        this.atoTipos = new ArrayList<AtoTipo>();
    }    

    public void pesquisarTiposSelo() {
        this.tiposSelo = tipoSeloServico.pesquisar(tipoSeloPesquisa);
    }
    
    public void selecionarTipoSelo() {
        this.atoEditar.setTipoSelo(this.tipoSeloSelecionado);
        
        this.tipoSeloPesquisa = new TipoSelo();
        this.tipoSeloSelecionado = new TipoSelo();
        this.tiposSelo = new ArrayList<TipoSelo>();
    }
    
    public void atualizar() {
        this.atoCamposSelecionados = this.atoCompoDualList.getTarget();
        this.atoEditar.setAtoCampos(this.atoCamposSelecionados);
        
        atoServico.atualizar(this.atoEditar);
        Mensagem.messagemInfo("Ato atualizado com sucesso!");
    }
    
    public void deletar() {
        atoServico.deletar(this.atoDeletar);

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        FacesContext fc = FacesContext.getCurrentInstance();
        FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO, "Ato excluído com sucesso!", ""));
        fc.getExternalContext().getFlash().setKeepMessages(true);

        try {
            context.redirect("pesquisarAto.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(ManagerPesquisarAto.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    
    public Ato getAtoDeletar() {
        return atoDeletar;
    }

    public void setAtoDeletar(Ato atoDeletar) {
        this.atoDeletar = atoDeletar;
    }

    public Ato getAtoPesquisar() {
        return atoPesquisar;
    }

    public void setAtoPesquisar(Ato atoPesquisar) {
        this.atoPesquisar = atoPesquisar;
    }

    public Ato getAtoEditar() {
        return atoEditar;
    }

    public void setAtoEditar(Ato atoEditar) {
        this.atoEditar = atoEditar;
    }
   
    public Ato getAtoVisualizar() {
        return atoVisualizar;
    }

    public void setAtoVisualizar(Ato atoVisualizar) {
        this.atoVisualizar = atoVisualizar;
    }

    public List<Ato> getAtos() {
        return atos;
    }

    public void setAtos(List<Ato> atos) {
        this.atos = atos;
    }

    public List<Ato> getAtosVisualizar() {
        return atosVisualizar;
    }

    public void setAtosVisualizar(List<Ato> atosVisualizar) {
        this.atosVisualizar = atosVisualizar;
    }

    public AtoCampoServico getAtoCampoServico() {
        return atoCampoServico;
    }

    public void setAtoCampoServico(AtoCampoServico atoCampoServico) {
        this.atoCampoServico = atoCampoServico;
    }

    public List<AtoCampo> getAtoCampos() {
        return atoCampos;
    }

    public void setAtoCampos(List<AtoCampo> atoCampos) {
        this.atoCampos = atoCampos;
    }

    public List<AtoCampo> getAtoCamposSelecionados() {
        return atoCamposSelecionados;
    }

    public void setAtoCamposSelecionados(List<AtoCampo> atoCamposSelecionados) {
        this.atoCamposSelecionados = atoCamposSelecionados;
    }

    public DualListModel<AtoCampo> getAtoCompoDualList() {
        return atoCompoDualList;
    }

    public void setAtoCompoDualList(DualListModel<AtoCampo> atoCompoDualList) {
        this.atoCompoDualList = atoCompoDualList;
    }

    public AtoTipo getAtoTipoPesquisa() {
        return atoTipoPesquisa;
    }

    public void setAtoTipoPesquisa(AtoTipo atoTipoPesquisa) {
        this.atoTipoPesquisa = atoTipoPesquisa;
    }

    public AtoTipo getAtoTipoSelecionado() {
        return atoTipoSelecionado;
    }

    public void setAtoTipoSelecionado(AtoTipo atoTipoSelecionado) {
        this.atoTipoSelecionado = atoTipoSelecionado;
    }

    public List<AtoTipo> getAtoTipos() {
        return atoTipos;
    }

    public void setAtoTipos(List<AtoTipo> atoTipos) {
        this.atoTipos = atoTipos;
    }

    public TipoSelo getTipoSeloPesquisa() {
        return tipoSeloPesquisa;
    }

    public void setTipoSeloPesquisa(TipoSelo tipoSeloPesquisa) {
        this.tipoSeloPesquisa = tipoSeloPesquisa;
    }

    public TipoSelo getTipoSeloSelecionado() {
        return tipoSeloSelecionado;
    }

    public void setTipoSeloSelecionado(TipoSelo tipoSeloSelecionado) {
        this.tipoSeloSelecionado = tipoSeloSelecionado;
    }

    public List<TipoSelo> getTiposSelo() {
        return tiposSelo;
    }

    public void setTiposSelo(List<TipoSelo> tiposSelo) {
        this.tiposSelo = tiposSelo;
    }
    
}
